package com.lvhx.java8;

import org.junit.Test;

public class StringTableTest {

    @Test
    public void test1(){
        String a = new String("a");//在堆和常量池中都创建对象，返回对象的地址
        String a1 = "a";//返回常量池中对象的地址
        System.out.println(a == a1); //false
    }

    /**
     * a.intern();
     * 表示如果常量池中不存在，则添加到常量池中，返回常量池中地址
     * 如果存在，则不做操作
     *
     * jdk1.6中，如果串池中没有，则把该对象复制一份，放入串池，返回串池对象的地址
     * jdk1.7后，如果没有，则把该对象的引用地址复制一份，放入串池，返回串池的引用地址
     */
    @Test
    public void test2(){
        String a = new String("a");//在堆和常量池中都创建对象，返回对象的地址
        a.intern();
        String a1 = "a";//返回常量池中对象的地址
        System.out.println(a == a1); //false
    }

    /**
     * 常量与常量的拼接结果在常量池，因为编译期优化
     * 只要有一个是变量，结果就在堆中，拼接原理是StringBulider
     */
    @Test
    public void test3(){
        String ab = new String("a") + new String("b");
        String intern = ab.intern();
        String ab1 = "ab";
        System.out.println(ab == ab1);//true
        System.out.println(ab == intern);//true
    }

    @Test
    public void test4(){

    }
}
